﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace FlyingCircusWebIS.Models
{
    public class AeronaveService : IAeronaveService
    {
        private IAeronaveDAO aeronaveDAO;
        private IModeloAeronaveDAO modeloAeronaveDAO;
        private IVooDAO vooDAO;

        public AeronaveService()
        {
            aeronaveDAO = new AeronaveDAO();
            modeloAeronaveDAO = new ModeloAeronaveDAO();
            vooDAO = new VooDAO();
        }

        public List<ValidationResult> ValidarEntidade(Aeronave entidade)
        {
            List<ValidationResult> erros = new List<ValidationResult>();

            bool edicao = false;
            if (entidade.IdAeronave != 0)
                edicao = true;

            if (edicao)
            {
                List<ValidationResult> errosAtualizar = ValidaAtualizar(entidade);
                if (errosAtualizar != null)
                    erros.AddRange(errosAtualizar);
            }
            else
            {
                List<ValidationResult> errosAdicionar = ValidaAdicionar(entidade);
                if (errosAdicionar != null)
                    erros.AddRange(errosAdicionar);
            }

            return erros;
        }

        public List<ValidationResult> ValidaAdicionar(Aeronave entidade)
        {
            List<ValidationResult> erros = new List<ValidationResult>();

            bool existeDescricao = aeronaveDAO.Listar().Any(e => e.Descricao.Equals(entidade.Descricao, StringComparison.InvariantCultureIgnoreCase));
            if (existeDescricao)
                erros.Add(new ValidationResult("Já existe um registro com a descrição informada."));

            return erros;
        }

        public void Adicionar(Aeronave entidade)
        {
            aeronaveDAO.Adicionar(entidade);
        }

        public List<ValidationResult> ValidaAtualizar(Aeronave entidade)
        {
            List<ValidationResult> erros = new List<ValidationResult>();

            bool existeDescricao = aeronaveDAO.Listar().Any(e => e.Descricao.Equals(entidade.Descricao, StringComparison.InvariantCultureIgnoreCase)
                && e.IdAeronave != entidade.IdAeronave);
            if (existeDescricao)
                erros.Add(new ValidationResult("Já existe um registro com a descrição informada."));

            return erros;
        }

        public void Atualizar(Aeronave entidade)
        {
            aeronaveDAO.Atualizar(entidade);
        }

        public Aeronave BuscarPorId(int id)
        {
            return aeronaveDAO.BuscarPorId(id);
        }

        public void AtivarPorId(int id)
        {
            aeronaveDAO.AtivarPorId(id);
        }

        public List<ValidationResult> ValidaRemoverPorId(int id)
        {
            List<ValidationResult> erros = new List<ValidationResult>();

            bool temDependencia = vooDAO.Listar().Any(e => e.IdAeronave == id);
            if (temDependencia)
                erros.Add(new ValidationResult("O registro tem dependência em outro contexto."));

            return erros;
        }

        public void RemoverPorId(int id)
        {
            aeronaveDAO.RemoverPorId(id);
        }

        public void DesativarPorId(int id)
        {
            aeronaveDAO.DesativarPorId(id);
        }

        public List<Aeronave> Listar()
        {
            return aeronaveDAO.Listar();
        }

        public List<Aeronave> ListarAtivos()
        {
            return aeronaveDAO.Listar().FindAll(a => a.FlagAtivo.Equals("S"));
        }

        public List<ModeloAeronave> ListarModeloAeronave()
        {
            return modeloAeronaveDAO.Listar();
        }

        public List<SelectListItem> ListarItensModeloAeronave()
        {
            List<ModeloAeronave> modelos = modeloAeronaveDAO.Listar();
            List<SelectListItem> itens = ConverterRegistrosModeloAeronaveParaItens(modelos);
            return itens;
        }

        private List<SelectListItem> ConverterRegistrosModeloAeronaveParaItens(List<ModeloAeronave> modelos)
        {
            List<SelectListItem> itens = new List<SelectListItem>();
            itens.Add(new SelectListItem { Text = "<Nenhum>", Value = "" });
            foreach (var modelo in modelos)
            {
                itens.Add(new SelectListItem() { Text = modelo.Prefixo, Value = modelo.IdModeloAeronave.ToString() });
            }
            return itens;
        }

        public List<SelectListItem> ListarItensAeronavesParaNovo()
        {
            List<SelectListItem> itens = new List<SelectListItem>();
            itens.Add(new SelectListItem { Text = "<Nenhum>", Value = "" });
            return itens;
        }

        public List<SelectListItem> ListarItensAeronaveFormatado()
        {
            List<Aeronave> registro = Listar();
            List<SelectListItem> itens = converterRegistrosAeronavesParaItens(registro);
            return itens;
        }

        public List<SelectListItem> ListarItensAtivosAeronaveFormatado()
        {
            List<Aeronave> registro = ListarAtivos();
            List<SelectListItem> itens = converterRegistrosAeronavesParaItens(registro);
            return itens;
        }

        private List<SelectListItem> converterRegistrosAeronavesParaItens(List<Aeronave> aeronaves)
        {
            List<SelectListItem> itens = new List<SelectListItem>();

            if (aeronaves.Count == 0)
            {
                itens.Add(new SelectListItem { Text = "<Nenhum>", Value = "" });
            }
            else
            {
                ModeloAeronaveDAO modeloAeronaveDAO = new ModeloAeronaveDAO();
                foreach (var aeronave in aeronaves)
                {
                    ModeloAeronave modeloAeronave = modeloAeronaveDAO.BuscarPorId(aeronave.IdModeloAeronave);
                    itens.Add(new SelectListItem { Text = modeloAeronave.Prefixo + " " + aeronave.Descricao + " - " + modeloAeronave.Assentos.ToString() + " assentos", Value = aeronave.IdAeronave.ToString(), Selected = true });

                }
            }

            return itens;
        }

        public List<SelectListItem> ListarItensAeronaveFormatadoParaFiltro()
        {
            List<SelectListItem> itens = new List<SelectListItem>();
            itens.Add(new SelectListItem { Text = "<Todas>", Value = "" });
            itens.AddRange(ListarItensAeronaveFormatado());
            return itens;
        }
    }
}